package com.example.system.service.impl;

import com.example.common.utils.StringUtils;
import com.example.system.domain.bo.PageBo;
import com.example.system.domain.entity.Config;
import com.example.system.domain.vo.PageVo;
import com.example.system.mapper.ConfigMapper;
import com.example.system.service.ConfigService;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class ConfigServiceImpl implements ConfigService {
    @Autowired
    private ConfigMapper configMapper;

    /**
     * 根据key值获取cocnfig
     */
    @Override
    public Config getByKey(String key) {
        return configMapper.getOneByKey(key);
    }

    /**
     * 获取参数列表-分页
     */
    @Override
    public PageVo getPageVo(PageBo pageBo) {
        List<Config> list = this.getList();
        return new PageVo(pageBo, list);
    }

    /**
     * 获取参数列表-分页
     */
    public List<Config> getList() {
        return configMapper.getList();
    }

    /**
     * 搜索参数列表-不分页
     */
    @Override
    public List<Config> getListBySearch(String key) {
        List<Config> list = this.getList();
        list = list.stream().filter(o -> o.getKey().equals(key)).collect(Collectors.toList());
        return list;
    }

    /**
     * 添加参数
     */
    @Override
    public String insertConfig(Config config) {
        this.checkConfigBeforeInsert(config);
        configMapper.insertConfig(config);
        return "添加成功";
    }

    /**
     * 删除参数
     */
    @Override
    public String deleteConfig(String id) {
        configMapper.deleteById(id);
        return "删除成功";
    }

    /**
     * 修改参数
     */
    @Override
    public String updateConfig(Config config) {
        this.checkConfigBeforeUpdate(config);
        configMapper.updateConfig(config);
        return "修改成功";
    }

    /**
     * 获取参数列表-分组
     */
    @Override
    public Map<String, List<Config>> getMap() {
        List<Config> list = this.getList();
        Map<String, List<Config>> map = list.stream().collect(Collectors.groupingBy(Config::getKey));
        return map;
    }

    /**
     * 修改前校验
     */
    @SneakyThrows
    private void checkConfigBeforeUpdate(Config config) {
        checkConfig(config);
        boolean configExists = configMapper.configExists(config);
        if (configExists) {
            throw new Exception("修改失败：参数重复！");
        }
    }

    /**
     * 添加前校验
     */
    @SneakyThrows
    private void checkConfigBeforeInsert(Config config) {
        checkConfig(config);
        List<Config> list = this.getList();
        list = list.stream().filter(o -> o.getKey().equals(config.getKey()) && o.getValue().equals(config.getValue())).collect(Collectors.toList());
        if (StringUtils.isNotEmpty(list)) {
            throw new Exception("添加失败：参数已存在！");
        }
    }

    /**
     * 公共校验
     */
    @SneakyThrows
    private void checkConfig(Config config) {
        if (StringUtils.isEmpty(config.getKey())) {
            throw new Exception("数据检查出现异常：参数标识符不能为空");
        }
        if (StringUtils.isEmpty(config.getValue())) {
            throw new Exception("数据检查出现异常：参数内容不能为空");
        }
    }

}
